// arcade controller thing // Copyright (c) 2017 Clinton Ebadi // GPLv3 or (at your option) any later version // .. insert license text here ... use use // PREVIEW union () { rotate ([-10, 0, 0]) translate ([0, 0, box_h+20]) panel (); case (); } // CONFIGURATION panel_w = 250; panel_h = 120; box_h = 80; // fixme: box_d. box_wall = 2; base_h = 5; //fixme: thickness? // bcube parameters, clean up cr = box_wall*2; cres = 0; $button_d = 28; js_width = 85; js_height = 40; // PANEL COMPONENTS module button (bezel = $button_d+4) { circle (d=$button_d); %circle(d=bezel); } module joystick () { bolt_d = 8; center_hole_d = 24; for (x = [-js_width/2, js_width/2], y = [-js_height/2, js_height/2]) { translate ([x, y, 0]) circle (d=bolt_d); // need slot instead } circle (d=center_hole_d); %square ([js_width, js_height], center=true); // not right... } // CASE module case_base (h=base_h) { bcube([panel_w, panel_h, h], cr, cres); } module case_walls () { difference() { bcube([panel_w, panel_h, box_h-base_h], cr, cres); bcube([panel_w-box_wall, panel_h-box_wall, box_h], cr, cres); } } module case () { case_base (); translate ([0, 0, (box_h)/2]) case_walls (); } // PANEL module panel () { difference () { case_base (); linear_extrude (base_h*2,center=true) panel_layout (); } } module panel_attach (position, angle=0) { x = position[0]; y = position[1]; c1 = [ [x, y, base_h/2], [0,0,1], angle ]; //[0, 0, h]; a1 = [ [0,0, 0], [0,0,0], 0 ]; // connector (c1); attach (c1, a1) children (); } // panel layout inspired by the Neo Geo layout module panel_layout () { translate ([-panel_w/2 + 40, 0, 0]) { panel_attach ([0, 0], 90) joystick (); // p1, coin (floating off in the distance...) union () { $button_d=18; for (x = [0, $button_d+10]) { panel_attach ([x, 90]) button (); panel_attach ([x, 90]) button (); } } // a, b, c, d union () { buttons_offset = 60; panel_attach ([buttons_offset, 0]) button (); for (i = [ 1 : 3 ]) { panel_attach ([i*($button_d+10)+buttons_offset-5, 30]) button (); } } } }